package dao;

import beans.Promotion;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import static dao.DAOUtilitaire.*;
import java.util.ArrayList;
import java.util.List;


public class PromotionDAOImpl implements PromotionDAO {
    
    private DAOFactory  daoFactory;
       
    private static final String SQL_INSERT = "INSERT INTO promotion (libelle_promo, annee_promo) VALUES (?,?)"; 
    private static final String SQL_SELECT_PAR_IDPROF = "SELECT id_promo, libelle_promo, annee_promo FROM promotion p, utilisateur u, affecte_promo_utilisateur a WHERE p.id_promo = a.promotion AND a.utilisateur = u.id_utilisateur AND id_utilisateur = ?";
    private static final String SQL_SELECT_ALL_PROMOTIONS = "SELECT * from promotion";
    private static final String SQL_SELECT_PAR_IDEXAM = "SELECT p.id_promo, p.libelle_promo, p.annee_promo FROM promotion p, examen e WHERE e.id_exam = ? AND id_promo = e.promotion";
    
            public PromotionDAOImpl(DAOFactory daoFactory) {
        this.daoFactory = daoFactory;
    }
    
 /**
 * Simple méthode utilitaire permettant de faire la correspondance (le
 * mapping) entre une ligne issue de la table des utilisateurs (un
 * ResultSet) et un bean Promotion.
 */
    private static Promotion map( ResultSet resultSet ) throws SQLException {
        Promotion promotion = new Promotion();
        promotion.setId_promo( resultSet.getInt("id_promo"));
        promotion.setLibelle_promo(resultSet.getString("libelle_promo"));
        promotion.setAnnee_promo(resultSet.getInt("annee_promo"));
        return promotion;
    }  
         
    @Override
    public void creerPromotion( Promotion promotion ) throws IllegalArgumentException, DAOException{
        Connection connexion = null;
        PreparedStatement preparedStatement = null;
        ResultSet valeursAutoGenerees = null;
        try {
            /* Récupération d'une connexion depuis la Factory */
            connexion = daoFactory.getConnection();
            preparedStatement = initialisationRequetePreparee( connexion, SQL_INSERT, true, promotion.getLibelle_promo(), promotion.getAnnee_promo());
            int statut = preparedStatement.executeUpdate();
            /* Analyse du statut retourné par la requête d'insertion */
            if ( statut == 0 ) {
                throw new DAOException( "Échec de la création de la promotion, aucune ligne ajoutée dans la table." );
            }
            /* Récupération de l'id auto-généré par la requête d'insertion */
            valeursAutoGenerees = preparedStatement.getGeneratedKeys();
            if ( valeursAutoGenerees.next() ) {
                /* Puis initialisation de la propriété id du bean Promotion avec sa valeur */
                promotion.setId_promo(valeursAutoGenerees.getInt( 1 ) );
            } else {
                throw new DAOException( "Échec de la création de la promotion en base, aucun ID auto-généré retourné." );
            }
        } catch ( SQLException e ) {
            throw new DAOException( e );
        } finally {
            fermeturesSilencieuses( valeursAutoGenerees, preparedStatement, connexion );
        }
    }

    @Override
    public List<Promotion> toutesLesPromos() {
        Connection connexion = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        List<Promotion> prom = new ArrayList<Promotion>();

        try {
            /* Récupération d'une connexion depuis la Factory */
            connexion = daoFactory.getConnection();
            preparedStatement = initialisationRequetePreparee( connexion, SQL_SELECT_ALL_PROMOTIONS, true);
            resultSet = preparedStatement.executeQuery();            

            while(resultSet.next()){
               prom.add(map(resultSet));
            }
            return prom;        
        } catch ( SQLException e ) {
            throw new DAOException( e );
        } finally {
            fermeturesSilencieuses( resultSet, preparedStatement, connexion );
        }
    }
    
    @Override
    public List<Promotion> promotionsPriseEnCharge(Integer idProf) throws IllegalArgumentException, DAOException{
        Connection connexion = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        List<Promotion> promotions = new ArrayList<Promotion>();

        try {
            /* Récupération d'une connexion depuis la Factory */
            connexion = daoFactory.getConnection();
            preparedStatement = initialisationRequetePreparee( connexion, SQL_SELECT_PAR_IDPROF, true, idProf);
            resultSet = preparedStatement.executeQuery();            

            while(resultSet.next()){
               promotions.add(map(resultSet));
            }
            return promotions;    
            
        } catch ( SQLException e ) {
            throw new DAOException( e );
        } finally {
            fermeturesSilencieuses( resultSet, preparedStatement, connexion );
        }
    }
    
    @Override
        public Promotion trouverPromotionParExamen(Integer idExamen) throws DAOException {
            Connection connexion = null;
            PreparedStatement preparedStatement = null;
            ResultSet resultSet = null;
            Promotion promotion = new Promotion();

        try {
            /* Récupération d'une connexion depuis la Factory */
            connexion = daoFactory.getConnection();
            preparedStatement = initialisationRequetePreparee( connexion, SQL_SELECT_PAR_IDEXAM, true, idExamen);
            resultSet = preparedStatement.executeQuery();            

            while(resultSet.next()){
               promotion=(map(resultSet));
            }
            return promotion;    
            
        } catch ( SQLException e ) {
            throw new DAOException( e );
        } finally {
            fermeturesSilencieuses( resultSet, preparedStatement, connexion );
        }
    }
        
  
}
